#ifndef __OBJECT_HEADER_OBJ_H__

#define __OBJECT_HEADER_OBJ_H__

/**
 * @file header_obj.h
 * @author your name (you@domain.com)
 * @brief 对象头相关信息
 * @version 0.1
 * @date 2022-07-02
 * 
 * @copyright Copyright (c) 2022
 * 
 */

#include "utils.h"


typedef enum {
    OT_CLASS,
    OT_LIST,
    OT_MAP,
    OT_MODULE,
    OT_RANGE,
    OT_STRING,
    OT_UPVALUE,
    OT_FUNCTION,
    OT_CLOSURE,
    OT_INSTANCE,
    OT_THREAD
} ObjType;  // 对象类型

/**
 * 对象头，用于记录对象的元信息
 */
typedef struct objHeader {
    ObjType type;  // 对象类型
    int isDark; // 对象是否可达，用于垃圾回收
    Class *class;  // 对象所属的类
    struct ObjHeader *next;  // 用于链接所有已分配对象
} ObjHeader; // 对象头，用于记录元信息和垃圾回收

typedef enum {
    VT_UNDEFINED, // 未定义
    VT_NULL,  // 空值
    VT_FALSE, // 布尔假
    VT_TRUE, // 布尔真
    VT_NUM, // 数字类型
    VT_OBJ // 对象类型
} ValueType;  // value 类型

typedef struct {
    ValueType type; // 值的类型
    union {
        double num;  // 表示数字
        ObjHeader *objHeader; // 表示对象
    };
} Value;

DECLARE_BUFFER_TYPE(Value)

void initObjHeader(VM *vm, ObjHeader *objHeader, ObjType objType, Class *class);

#endif